💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    16 웹소켓 | ✅ 저자: 이유정(박사)

    웹소켓(WebSocket)은 서버와 클라이언트 간에 지속적으로 연결을 유지하면서 양방향 통신을 가능하게 하는 통신 프로토콜입니다. 웹소켓은 HTTP처럼 처음엔 요청을 시작하지만, 연결 후에는 끊지 않고 유지하면서 클라이언트와 서버가 양방향·실시간 통신을 할 수 있게 해주는 프로토콜입니다.

    1️⃣ [패키지 설치] WebSocket 모듈 설치

    pip install websockets
    pip install "uvicorn[standard]
    pip install --force-reinstall websockets
    

    이 패키지는 FastAPI가 WebSocket을 비동기로 처리하기 위해 필요합니다.

    2️⃣ [서버 코드 작성] WebSocket 서버 만들기 : 파일명 예시: websocketsServer.py

    from fastapi import FastAPI, WebSocket
    from fastapi.responses import HTMLResponse
    
    app = FastAPI()
    
    @app.websocket("/ws") # 클라이언트는 ws://localhost:8000/ws 로 연결
    async def websocket_endpoint(websocket: WebSocket):
        await websocket.accept() # 클라이언트의 WebSocket 연결 요청을 수락
        while True:
        
    	    # 클라이언트로부터 텍스트 메시지를 기다림 (await → 비동기 처리)
            data = await websocket.receive_text()
    		
    		# 받은 메시지를 다시 클라이언트에게 전송 (Echo 방식)
            await websocket.send_text(f"Message text was: {data}")
    
    • /ws 경로로 클라이언트가 WebSocket 연결 요청
    • 연결 수락 후, 클라이언트 메시지를 받아서 다시 응답(echo) 전송

    [HTML 클라이언트 코드 작성] WebSocket 클라이언트 구현 같은 서버 파일에 HTML 문자열 추가
    (websocketsFullCode.py 형태로 작성 가능)

    html = """
    <!DOCTYPE html>
    <html>
      <head><title>Chat</title></head>
      <body>
        <h1>WebSocket Chat</h1>
        <form action="" onsubmit="sendMessage(event)">
            <input type="text" id="messageText" autocomplete="off"/>
            <button>Send</button>
        </form>
        <ul id='messages'></ul>
    
        <script>
            var ws = new WebSocket("ws://localhost:8000/ws");
    
            ws.onmessage = function(event) {
                var messages = document.getElementById('messages');
                var message = document.createElement('li');
                var content = document.createTextNode(event.data);
                message.appendChild(content);
                messages.appendChild(message);
            };
    
            function sendMessage(event) {
                var input = document.getElementById("messageText");
                ws.send(input.value);
                input.value = '';
                event.preventDefault();
            }
        </script>
      </body>
    </html>
    """
    

    4️⃣ [HTML 렌더링 라우트 추가] 같은 Python 파일 안에 HTML을 반환하는 GET 라우터 추가:

    @app.get("/")
    async def get():
        return HTMLResponse(html)
    

    5️⃣ [전체 서버 코드 완성]

    from fastapi import FastAPI, WebSocket
    from fastapi.responses import HTMLResponse
    
    app = FastAPI()
    
    html = """ (위의 HTML 코드 그대로) """
    
    @app.get("/")
    async def get():
        return HTMLResponse(html)
    
    @app.websocket("/ws")
    async def websocket_endpoint(websocket: WebSocket):
        await websocket.accept()
        while True:
            data = await websocket.receive_text()
            await websocket.send_text(f"Message text was: {data}")
    

    6️⃣ [서버 실행]

    uvicorn websocketsFullCode:app --reload
    

    7️⃣[웹에서 실행 테스트] http://127.0.0.1:8000/

    TOP
    preload preload